test_that("with_golem_options() returns the maintenance page", {
	res <- withr::with_envvar(
		c(
			"GOLEM_MAINTENANCE_ACTIVE" = "TRUE"
		),
		{
			with_golem_options(
				shiny::shinyApp(
					ui = list(),
					server = function(
						input,
						output,
						session
					) {}
				),
				golem_opts = list()
			)
		}
	)
	ui <- res$httpHandler(
		list(
			"REQUEST_METHOD" = "GET",
			"PATH_INFO" = "/"
		)
	)
	expect_equal(
		as.character(
			ui$content
		),
		as.character(
			maintenance_page()
		)
	)
})

test_that("We can explicitely print the golem app", {
	res <- testthat::with_mocked_bindings(
		.package = "base",
		print = function(
			...
		) {
			return(
				"Kilian Jornet"
			)
		},
		code = {
			with_golem_options(
				print = TRUE,
				shiny::shinyApp(
					ui = list(),
					server = function(
						input,
						output,
						session
					) {}
				),
				golem_opts = list()
			)
		}
	)
	expect_equal(
		res,
		"Kilian Jornet"
	)
})

test_that("with_golem_options() disables 'print'-flag on Posit for SHINY_PORT", {
	# This tests is here so that we ensure that
	# even if the `print` is set to TRUE in with_golem_options,
	# it is turned off if we detect that we are on
	# a Posit Connect machine, using the
	# SHINY_PORT env var

	res <- withr::with_envvar(
		c("SHINY_PORT" = "1234"),
		{
			with_golem_options(
				print = TRUE,
				shiny::shinyApp(
					ui = list(),
					server = function(
						input,
						output,
						session
					) {}
				),
				golem_opts = list()
			)
		}
	)

	this_shouldnt_be_printed_but_be_a_shiny_app_obj <- {
		force(
			res
		)
	}
	expect_true(
		inherits(
			this_shouldnt_be_printed_but_be_a_shiny_app_obj,
			"shiny.appobj"
		)
	)
})


test_that("get_golem_options() retrieves 'golem_options'", {
	# 0. Preparation:
	# 0.A backup hidden variable '.global' from the shiny pkg-namespace
	tmp_globals_backup <- getFromNamespace(
		".globals",
		"shiny"
	)
	# 0.B make a full clone of this variable (which is an environment)
	tmp_globals_override <- as.environment(
		as.list(
			tmp_globals_backup,
			all.names = TRUE
		)
	)
	# 0.C mimick the existence of "golem_options" inside the clone
	tmp_globals_override$options$golem_options$country_01 <- "france"
	tmp_globals_override$options$golem_options$country_02 <- "germany"
	# I Testing:
	# I.A temporarily override ".globals" with the clone
	assignInNamespace(
		".globals",
		tmp_globals_override,
		ns = "shiny"
	)
	# I.B test that get_golem_options() correctly retrieves "golem_options"
	expect_equal(
		get_golem_options(),
		list(
			country_01 = "france",
			country_02 = "germany"
		)
	)
	expect_equal(
		get_golem_options("country_01"),
		"france"
	)
	expect_equal(
		get_golem_options("country_02"),
		"germany"
	)
	# II. reset global variable and check that this reset is successful
	assignInNamespace(
		".globals",
		tmp_globals_backup,
		ns = "shiny"
	)
	expect_null(
		getShinyOption("golem_options")
	)
	expect_null(
		get_golem_options()
	)
})
